Welcome to Django!

3.2 视图函数中的其他参数

视图函数中除了request之外,还可能有其他参数,如:路径参数和自定义函数。 并且他们都是按照关键字传参的方式。交给视图函数的。

如要掌握python函数的传参,先了解以下知识点:

位置参数

关键字参数

不定长参数,*args,**kwargs

request是位置参数,必须在第一个位置,如以下两个视图函数

第1个视图函数先定义的request形参,再定义的args和kwargs, 则test1函数被调用时第一个实参会赋值给我形参request, 多余的位置实参会按照元组的形式给args,多余的关键词参数会按照字典的形式给kwargs

第2个视图函数没有单独定义request形参,直接另一的args和kwargs, 则test2函数被调用时,所有的位置参数按照元组的形式给args,所有的关键词参数会按照字典的形式给kwargs;

使用路径转换器,或者使用re_path分组得到的路径值都会按照关键字的传参方式交给视图函数,如在path中使用路径转换器,访问的URL是:

http://127.0.0.1:8000/app03/test3/2023/12

那么kwargs这个字典就有两个键值对({“year”:2023,“month”:12}),如果把year和month单独定义在视图函数中,此时kwargs就是空字典了。

补充:

如果视图函数中,定义了request参数,那么args将永远为空元组

路径函数中使用了kwargs也是按照关键字传参的方式交给视图函数, 且优先级大于路径转换器。

def test0(request,*args,**kwargs):

#一旦这样设置(request,*args,**kwargs),那么test1就是不定长参数,

# 无论django怎么调用test1,都不会报错,因为可以接受任何形式的传参。

# *args是位置参数,**kwargs是关键字参数。

return HttpResponse( "显示request属性" )

path函数里面的功能:

URL:

from django.urls import path

from . import views


urlpatterns = [

path( "test" ,views.test),

#一旦调用test1, 那么kwargs将会以关键字的a=100,b=200这样的形式传给test1

path( "test1" , views.test,kwargs={ "a": 100 ,"b" : 200 }),

]


views:

def test1(request, a,b):        #要有对应的a、b参数来接收。

return HttpResponse( "显示request属性" )

运行后返回:

100 200

[05/May/2024 10:15:38] "GET /app03/test1 HTTP/1.1" 200 19


以上为指定参数,如果参数很多,变量也很多,则可以设置**kwargs来处理

URL:

from django.urls import path

from . import views


urlpatterns = [

path( "test" ,views.test),

#一旦调用test1, 那么kwargs将会以关键字的a=100,b=200这样的形式传给test1

path( "test1" , views.test1,kwargs={ "a" "b" , :100 : 200 } ),

]


views:

def test1(request,*args, **kwargs): # **kwargs是将所有关键字保存在**kwargs中,与urls中的kwargs不是一个东西

print (request)

print(args)

# *args 返回是一个空元组, 因为args返回是除了kwargs关键字和requset之个的位置参数

print(kwargs)

return HttpResponse( "显示request属性" )


返回:

< WSGIRequest: GET '/app03/test1'>

()

{'a': 100, 'b': 200}

[05/May/2024 10:49:32] "GET /app03/test1 HTTP/1.1" 200 19


def test1(*args, **kwargs): # 删除request

print (request)

print (args) # *args 返回是一个空元组,因为args返回是除了kwargs关键字和requset之个的位置参数

print (kwargs)

return HttpResponse( "显示request属性" )

返回:

(< WSGIRequest: GET '/app03/test1'>,)

{'a': 100, 'b': 200}

[05/May/2024 10:51:03] "GET /app03/test1 HTTP/1.1" 200 19


Test1 URL

from django.urls import path

from . import views


urlpatterns = [

path( "test" ,views.test),

#一旦调用test1,那么kwargs将会以关键字的a=100,b=200这样的形式传给test1

path( "test1" , views.test1,kwargs={ "a" : 100 , "b" : 200 }),

#test2(request,year,month)

path( "test2/<year>/<month>" , views.test2),


test2 views 只有request是按位置传参的,其他的按关键字传参

def test2(request,*args, **kwargs):      # **kwargs是将所有关键字保存在**kwargs中,与urls中的kwargs不是一个东西

print(request)

print(args) # *args 返回是一个空元组,因为args返回是除了kwargs关键字和requset之个的位置参数

print(kwargs)

return HttpResponse( "显示request属性" )